package com.wulis.generator.code;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.wulis.common.model.entity.BaseEntity;
import com.wulis.common.support.BaseMapper;
import com.wulis.common.support.BaseService;
import com.wulis.common.support.BaseServiceImpl;
import com.wulis.generator.config.DatasourceConfig;
import com.wulis.generator.config.GeneratorGlobalConfig;
import com.wulis.generator.config.ProjectConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Mapper;

import java.util.Collections;

import static com.wulis.generator.utils.CommonUtil.superEntityColumnsContainId;

/**
 * mybatis-plus代码生成器配置
 *
 * @author : WuliBao
 */
@Slf4j
public class SimpleGenerator {

    /**
     * 代码生成配置
     *
     * @param datasourceConfig datasourceConfig
     * @param projectConfig 项目配置
     * @param tableNames 表名
     * @param tablePrefix 过滤前缀
     * @return FastAutoGenerator
     */
    public static FastAutoGenerator config(DatasourceConfig datasourceConfig, ProjectConfig projectConfig,
        String[] tableNames, String[] tablePrefix) {
        return GeneratorGlobalConfig.get(datasourceConfig, projectConfig)
            // 包配置
            .packageConfig(builder -> builder
                // 设置父包名
                .parent(projectConfig.getPackageName())
                // 设置父包模块名
                .moduleName(projectConfig.getFunctionModule())
                // Entity包名
                .entity("model.entity")
                // controller包名
                .controller("controller")
                // 设置 Service 包名
                .service("service")
                // 设置 Service Impl 包名
                .serviceImpl("service.impl")
                // 设置 Mapper 包名
                .mapper("mapper")
                .pathInfo(Collections.singletonMap(OutputFile.xml,
                    projectConfig.getProjectPath() + "/src/main/resources/mapper/"
                        + projectConfig.getFunctionModule())))
            // 设置需要生成的表名
            .strategyConfig(builder -> builder
                // 表名
                .addInclude(tableNames)
                // 设置过滤表前缀
                .addTablePrefix(tablePrefix)
                // entity配置
                .entityBuilder()
                // 关闭生成序列化字段
                .disableSerialVersionUID()
                // 生成Accessors
                .enableChainModel()
                // 继承BaseEntity
                .superClass(BaseEntity.class)
                // 覆盖已有文件
                .enableFileOverride()
                // 开启 Lombok 模型
                .enableLombok()
                // 开启生成实体时生成字段注解
                .enableTableFieldAnnotation()
                // 忽略父类公共字段
                .addSuperEntityColumns(superEntityColumnsContainId(BaseEntity.class).toArray(String[]::new))
                // 开启 ActiveRecord 模型
                .enableActiveRecord()
                // entity模版
                .javaTemplate("/templates/model/entity/entity.java")
                // controller配置
                .controllerBuilder().disable()
                // service配置
                .serviceBuilder()
                // 覆盖已有文件
                .enableFileOverride()
                // 设置生成的Service名称
                .formatServiceFileName("%sService")
                // 继承BaseService
                .superServiceClass(BaseService.class)
                // service模版
                .serviceTemplate("/templates/service/serviceSimple.java")
                // 设置生成的Service实现类名称
                .formatServiceImplFileName("%sServiceImpl")
                // 继承BaseServiceImpl
                .superServiceImplClass(BaseServiceImpl.class)
                // 设置ServiceImpl模板
                .serviceImplTemplate("/templates/service/impl/serviceImplSimple.java")
                // mapper配置
                .mapperBuilder()
                // 覆盖已有文件
                .enableFileOverride()
                // 设置生成的Mapper名称
                .formatMapperFileName("%sMapper")
                // 继承BaseMapper
                .superClass(BaseMapper.class)
                // 生成BaseResultMap
                // .enableBaseResultMap()
                // Mapper注解
                .mapperAnnotation(Mapper.class)
                // mapper模版
                .mapperTemplate("/templates/mapper/mapper.java")
                // 设置生成的Mapper XML名称
                .formatXmlFileName("%sMapper")
                // xml模版
                .mapperXmlTemplate("/templates/mapper/xml/mapper.xml"))
            // 使用Freemarker引擎模板，默认的是Velocity引擎模板
            .templateEngine(new FreemarkerTemplateEngine());
    }
}
